"""
PySide6 TableView 单元格合并（Span）示例
演示如何使用 setSpan 合并单元格
"""

from PySide6.QtWidgets import (
    QApplication, QMainWindow, QTableView, QVBoxLayout, 
    QWidget, QPushButton, QHBoxLayout
)
from PySide6.QtGui import QStandardItemModel, QStandardItem, QColor
from PySide6.QtCore import Qt
import sys


class SpanTableDemo(QMainWindow):
    """单元格合并演示主窗口"""
    
    def __init__(self):
        super().__init__()
        self.init_ui()
        self.setup_model()
        self.apply_spans()
    
    def init_ui(self):
        """初始化UI"""
        self.setWindowTitle('TableView Span 示例')
        self.setGeometry(100, 100, 800, 600)
        
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)
        
        # 按钮工具栏
        toolbar = QHBoxLayout()
        
        self.btn_span1 = QPushButton('合并示例1：标题行')
        self.btn_span1.clicked.connect(self.example_span_header)
        toolbar.addWidget(self.btn_span1)
        
        self.btn_span2 = QPushButton('合并示例2：分类列')
        self.btn_span2.clicked.connect(self.example_span_category)
        toolbar.addWidget(self.btn_span2)
        
        self.btn_span3 = QPushButton('合并示例3：复杂合并')
        self.btn_span3.clicked.connect(self.example_span_complex)
        toolbar.addWidget(self.btn_span3)
        
        self.btn_reset = QPushButton('重置')
        self.btn_reset.clicked.connect(self.reset_spans)
        toolbar.addWidget(self.btn_reset)
        
        toolbar.addStretch()
        layout.addLayout(toolbar)
        
        # TableView
        self.table_view = QTableView()
        self.table_view.setAlternatingRowColors(True)
        layout.addWidget(self.table_view)
    
    def setup_model(self):
        """设置数据模型"""
        self.model = QStandardItemModel(10, 6)
        
        # 设置表头
        headers = ['分类', '产品', '数量', '单价', '金额', '备注']
        self.model.setHorizontalHeaderLabels(headers)
        
        # 填充示例数据
        data = [
            ['电子产品', '笔记本电脑', '5', '5000', '25000', '畅销'],
            ['电子产品', '平板电脑', '10', '3000', '30000', '热门'],
            ['电子产品', '手机', '20', '4000', '80000', '新品'],
            ['家具', '办公桌', '15', '800', '12000', '促销'],
            ['家具', '办公椅', '25', '500', '12500', ''],
            ['文具', '笔记本', '100', '10', '1000', ''],
            ['文具', '钢笔', '50', '20', '1000', ''],
            ['文具', '文件夹', '80', '5', '400', ''],
            ['总计', '', '', '', '162400', ''],
            ['', '', '', '', '', ''],
        ]
        
        for row_idx, row_data in enumerate(data):
            for col_idx, value in enumerate(row_data):
                item = QStandardItem(value)
                item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
                self.model.setItem(row_idx, col_idx, item)
        
        # 设置模型
        self.table_view.setModel(self.model)
        
        # 调整列宽
        self.table_view.resizeColumnsToContents()
    
    def apply_spans(self):
        """应用默认的单元格合并"""
        # 默认不合并，显示原始表格
        pass
    
    def example_span_header(self):
        """示例1：合并标题行"""
        self.reset_spans()
        
        # 合并最后一行的第0-5列（总计行）
        self.table_view.setSpan(8, 0, 1, 4)  # 从(8,0)开始，跨1行4列
        
        # 设置背景色突出显示
        item = self.model.item(8, 0)
        item.setText('总计')
        item.setBackground(QColor(255, 255, 200))
        
        self.statusBar().showMessage('示例1：合并第9行的前4列作为总计标题')
    
    def example_span_category(self):
        """示例2：合并分类列"""
        self.reset_spans()
        
        # 合并"电子产品"分类（第0-2行）
        self.table_view.setSpan(0, 0, 3, 1)  # 从(0,0)开始，跨3行1列
        item = self.model.item(0, 0)
        item.setBackground(QColor(200, 230, 255))
        
        # 合并"家具"分类（第3-4行）
        self.table_view.setSpan(3, 0, 2, 1)  # 从(3,0)开始，跨2行1列
        item = self.model.item(3, 0)
        item.setBackground(QColor(255, 230, 200))
        
        # 合并"文具"分类（第5-7行）
        self.table_view.setSpan(5, 0, 3, 1)  # 从(5,0)开始，跨3行1列
        item = self.model.item(5, 0)
        item.setBackground(QColor(230, 255, 200))
        
        self.statusBar().showMessage('示例2：合并分类列的相同分类')
    
    def example_span_complex(self):
        """示例3：复杂合并（行列都合并）"""
        self.reset_spans()
        
        # 合并分类列
        self.table_view.setSpan(0, 0, 3, 1)  # 电子产品
        self.table_view.setSpan(3, 0, 2, 1)  # 家具
        self.table_view.setSpan(5, 0, 3, 1)  # 文具
        
        # 合并总计行
        self.table_view.setSpan(8, 0, 1, 4)  # 总计标题
        
        # 合并空白区域
        self.table_view.setSpan(9, 0, 1, 6)  # 最后一行全部合并
        
        # 设置背景色
        self.model.item(0, 0).setBackground(QColor(200, 230, 255))
        self.model.item(3, 0).setBackground(QColor(255, 230, 200))
        self.model.item(5, 0).setBackground(QColor(230, 255, 200))
        self.model.item(8, 0).setBackground(QColor(255, 255, 200))
        self.model.item(8, 0).setText('总计')
        self.model.item(9, 0).setBackground(QColor(240, 240, 240))
        
        self.statusBar().showMessage('示例3：复杂合并（分类列 + 总计行 + 空白行）')
    
    def reset_spans(self):
        """重置所有合并"""
        # 清除所有span（通过将每个单元格设置为1行1列）
        for row in range(self.model.rowCount()):
            for col in range(self.model.columnCount()):
                self.table_view.setSpan(row, col, 1, 1)
        
        # 重新设置数据（清除背景色）
        self.setup_model()
        
        self.statusBar().showMessage('已重置所有合并')


def main():
    """主函数"""
    app = QApplication(sys.argv)
    window = SpanTableDemo()
    window.show()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()
